/*(C) Copyright

    This file is part of widget Meteoclimatic.
    Autor: Antonio Cristóbal Álvarez Abellán -> acabellan@gmail.com
    
    */

package deeloco.android.meteoclimatic.donate;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;

import deeloco.android.meteoclimatic.donate.Preferencias;
import deeloco.android.meteoclimatic.donate.net.estadoConexion;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Intent;
import android.content.Context;
import android.graphics.Color;
import android.net.ConnectivityManager;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.text.Html;
import android.util.Log;
import android.widget.RemoteViews;
import android.widget.Toast;

public class meteoclimatic extends AppWidgetProvider{
	
	private static final String PREFS_NAME = "deeloco.android.meteoclimatic.meteoclimatic_preferencias";
	private static Context contexto;
	static String tag="meteoclimatic.meteoclimatic";
	private static final String PREF_PREFIJO_CLAVE_NOMBRE = "nombre_";
	private static final String PREF_PREFIJO_CLAVE_CODIGO = "codigo_";
	public static String MY_WIDGET_UPDATE = "MY_OWN_WIDGET_UPDATE";
	private static String color_fondo;
	private static String color_medida;
	private static String color_unidad;
	private static alarmaMeteorologica alarma=new alarmaMeteorologica();
	//static estacion ee=new estacion();
	private static HashMap<Integer, estacion> estaciones = new HashMap<Integer, estacion>(); //Array asociativo con las estaciones. Clave=appWidgetIds, valor=clase estación
	
	@Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) 
	{
		//Intent intent = new Intent(context,UpdateService.class);
        //context.startService(intent);
		//super.onUpdate(context, appWidgetManager, appWidgetIds);
		contexto=context.getApplicationContext();
		final int N = appWidgetIds.length;
    	
    	Log.d(tag,"Numero de appWidgetIds="+N);
	    for (int i=0; i < N; i++) 
	    {
	        int appWidgetId = appWidgetIds[i];
	        if (!estaciones.containsKey(appWidgetId))
	        {
	        	estaciones.put(appWidgetId, new estacion(contexto));
	        }
	        //update the widget
	        updateAppWidget(context,appWidgetManager, appWidgetId);
	    }  
    }
	
    @Override
    public void onDeleted(Context context, int[] appWidgetIds) {
        Log.d(tag, "onDeleted");
        // When the user deletes the widget, delete the preference associated with it.
        final int N = appWidgetIds.length;
        for (int i=0; i<N; i++) {
            Preferencias.deleteTitlePref(context, appWidgetIds[i]);
        }
    }
    
    @Override
    public void onEnabled(Context context) {
    	//prepare Alarm Service to trigger Widget
		
		   Intent intent = new Intent(meteoclimatic.MY_WIDGET_UPDATE);
		   PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
		   AlarmManager alarmManager = (AlarmManager)context.getSystemService(context.ALARM_SERVICE);

		   //Calculamos los milisegundos
		   String p=PreferenceManager.getDefaultSharedPreferences(context).getString("listPeriodo", "30");
		   int periodo=0;
		   try
		   {
			   periodo=Integer.parseInt(p); //en minutos
			   periodo=periodo*60; //En segundos
			   periodo=periodo*1000; //En milisegundos
		   }
		   catch(Exception e)
		   {
			   Toast.makeText(context,R.string.error_periodo,Toast.LENGTH_LONG).show();
		   }
		   alarmManager.cancel(pendingIntent);
		   Log.d(tag,"Configurando ALARMA para un periodo de "+periodo);
		   if (periodo>0)
			   alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), periodo, pendingIntent);
		   Log.d(tag, "onEnabled");
		   	
    }
    
    @Override
    public void onDisabled(Context context) {
    	//Desactivamos todas las alarmas, cuande se cancele el último widget
    	Log.d(tag, "onDisabled");
        Intent intent = new Intent(meteoclimatic.MY_WIDGET_UPDATE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(context.ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        pendingIntent.cancel();
        Log.d(tag,"Cancelando todas las alarmas");        
         }
	
    /**
     * Actualiza los datos del widget descargando los datos del RSS de meteoclimatic
     * @param context
     * @param appWidgetManager
     * @param appWidgetId
     */
    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId)
    {
    	updateAppWidget(context, appWidgetManager, appWidgetId, true);
    }
    
    /**
     * Actualiza los datos del widget y el estilo.
     * @param context
     * @param appWidgetManager
     * @param appWidgetId
     * @param descargas
     */
	static void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId, boolean descargarDatos) 
	{
		RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_pantalla);
		
		//ACTUALIZACIÓN
		updateViews.setImageViewResource(R.id.estado,android.R.drawable.presence_away);
		appWidgetManager.updateAppWidget(appWidgetId, updateViews);
		
		//Cargamos el tema correspondiente
		String tema=PreferenceManager.getDefaultSharedPreferences(context).getString("listTema"+"_"+appWidgetId, "1");
		int colorMedidas=PreferenceManager.getDefaultSharedPreferences(context).getInt("cpMedidas"+"_"+appWidgetId, -16777216);
		int colorUnidades=PreferenceManager.getDefaultSharedPreferences(context).getInt("cpUnidades"+"_"+appWidgetId, -16777216);
		int colorFondo=PreferenceManager.getDefaultSharedPreferences(context).getInt("cpFondo"+"_"+appWidgetId, -1);

		if (tema.equals("1"))
		{
			color_fondo="FFFFFF";
			color_medida="#000000";
			color_unidad="#000000";
		}
		
		if (tema.equals("2"))
		{
			color_fondo="000000";
			color_medida="#FFFFFF";
			color_unidad="#FFFFFF";
		}
		
		if (tema.equals("3"))
		{
			color_fondo=Integer.toHexString(colorFondo).substring(2,8);;
			color_medida="#"+Integer.toHexString(colorMedidas).substring(2,8);
			color_unidad="#"+Integer.toHexString(colorUnidades).substring(2,8);;
		}
		
		//Activar/desactivar el fondo del widget
		String trans=PreferenceManager.getDefaultSharedPreferences(context).getString("listTransparencia"+"_"+appWidgetId, "FF");
		if (trans.length()==2)
			updateViews.setInt(R.id.widget, "setBackgroundColor",android.graphics.Color.parseColor("#"+trans+color_fondo));
		else
			updateViews.setInt(R.id.widget, "setBackgroundColor",android.graphics.Color.parseColor("#"+"88"+color_fondo));
		//Log.d(tag,"Transparencias "+trans);
		//updateViews.setInt(R.id.widget, "setBackgroundColor",android.graphics.Color.parseColor("#"+"88"+color_fondo));
		
		//Datos del widget
		
		Date date=new Date();
    	DateFormat format=SimpleDateFormat.getTimeInstance(SimpleDateFormat.SHORT,Locale.getDefault());
    	//Capturamos los datos de la estación
    	
    	//Log.d("meteoclimatic.updateAppWidget","INICIANDO PROCESO para el Id Widget="+appWidgetId);
    	//Log.d("meteoclimatic.updateAppWidget","Código de estación="+Preferencias.loadPref(context,PREF_PREFIJO_CLAVE_CODIGO,appWidgetId));

    	String nombreEstacion = Preferencias.loadPref(context,PREF_PREFIJO_CLAVE_NOMBRE,appWidgetId);
    	String codigoEstacion = Preferencias.loadPref(context,PREF_PREFIJO_CLAVE_CODIGO,appWidgetId);
    	if ((nombreEstacion!=null)) //Existe estación para el appWidgetId
    	{
			estacion ee=(estacion) estaciones.get(appWidgetId);
	    	ee.setNombre(nombreEstacion);
	    	ee.setCodigo(codigoEstacion);
	    	ee.setContexto(context);
	    	ee.setURL();
	    	Log.d("meteoclimatic. updateAppWidget","Iniciando actualización :" + format.format(date)+" - Estación: "+ee.getNombre());	
    		//FIN DE HILO
	    	if (descargarDatos) //Si hay que descargar datos
	    	{
	    		if (estadoConexion.getInstance(context).isOnline(context)) 
	    		{
	    			ee.descargarCapturarDatos();
	    			
	    			//Si no se han cargado los datos previos, se carga con los valores actuales.
	    			if (ee.getDatosMeteoPrev().B==0.0)
	    			{
	    				ee.setDatosMeteoPrev(ee.getDatosMeteo());
	    			}
	    		} 
	    		else 
	    		{
	    		    ee.setEstado(false);
	    		    ee.setError(context.getString(R.string.sinConexion));
	    		}
	    	}
	    	Log.d("meteoclimatic.updateAppWidget","Estado :" + ee.getEstado());
	    	if (ee.getEstado())
	    	{
	    		//LA ESTACIÓN ESTÁ ACTIVA
	    		updateViews.setImageViewResource(R.id.estado,android.R.drawable.presence_online);
	    		//Medida Principal
	    		//Obtenemos la medidad principal
	    		String medidaPpal=PreferenceManager.getDefaultSharedPreferences(context).getString("medidaPpal"+"_"+appWidgetId,datosMeteorologicos.TEMPERATURA);
	    		updateViews.setTextViewText(R.id.tw_medida_principal,Html.fromHtml(ee.getMedidaPpalHTML(medidaPpal, colorMedidas, tema)));
		    	updateViews.setTextViewText(R.id.nombreEstacion,Html.fromHtml("<font color='"+color_unidad+"'>"+ee.getNombreSinProvincia()+"</font>"));
		    	updateViews.setTextViewText(R.id.tw_provincia,Html.fromHtml("<font color='"+color_unidad+"'>"+ee.getProvincia(true)+"</font>"));
		    	
		    	//fechas
		    	/*updateViews.setTextViewText(R.id.tw_linea3_datos_izq,Html.fromHtml("<b>"+format.format(date)+"</b>"));
		    	updateViews.setTextColor(R.id.tw_linea3_datos_izq,Color.parseColor(color_unidad));
		    	String fechaEstacion=ee.getFechaLocal();
		    	updateViews.setTextColor(R.id.tw_linea3_datos_der,Color.parseColor(color_unidad));
		    	updateViews.setTextViewText(R.id.tw_linea3_datos_der,Html.fromHtml(fechaEstacion));*/
		    	String fechaEstacion=ee.getFechaLocal();
//		    	String fechaEstacion="<strong>"+ee.getHoraActualizacion()+"</strong> <small>"+ee.getDiaActualizacion()+"/"+ee.getMesActualizacion()+"</small>";
		    	
		    	updateViews.setTextViewText(R.id.tw_linea3_datos_izq,Html.fromHtml(fechaEstacion));
		    	updateViews.setTextColor(R.id.tw_linea3_datos_izq,Color.parseColor(color_unidad));
		    	
		    	
		    	
		    	//Línea de datos
		    	updateViews.setTextColor(R.id.tw_linea2_datos,Color.parseColor(color_unidad));
		    	updateViews.setTextViewText(R.id.tw_linea2_datos,Html.fromHtml(ee.getListaMedidasHTML
		    																					(
		    																					(medidaPpal.compareTo(datosMeteorologicos.TEMPERATURA)!=0), 
		    																					(medidaPpal.compareTo(datosMeteorologicos.HUMEDAD)!=0), 
		    																					(medidaPpal.compareTo(datosMeteorologicos.PRESION)!=0), 
		    																					(medidaPpal.compareTo(datosMeteorologicos.PRECIPITACION)!=0), 
		    																					(medidaPpal.compareTo(datosMeteorologicos.VIENTO)!=0), 
		    																					colorMedidas, 
		    																					tema, 
		    																					"|")
		    																	));
			
//				updateViews.setTextViewText(R.id.tw_linea1_datos,Html.fromHtml("<font color='"+color_fondo+"'> </font>"));
//				updateViews.setInt(R.id.tw_linea1_datos,"setBackgroundColor",android.graphics.Color.parseColor("#"+color_fondo));
		    	//Cargamos icono de estado del cielo
		    	updateViews.setImageViewBitmap(R.id.image,ee.getIcono());
		    	
		    	estaciones.put(appWidgetId, ee);
		    	
		    	//Lanzamos alarmas Meteorológicas
		    	alarma.setParam(context,appWidgetId,ee);
                alarma.comprobarAlarmas();
		    
	    	}
	    	else
	    	{
	    		//La estación no está activa
	    		//ee.capturarDatos();
	    		updateViews.setImageViewResource(R.id.estado,android.R.drawable.presence_offline);
	    		String fechaEstacion=ee.getFechaLocal();
		    	updateViews.setTextViewText(R.id.tw_linea3_datos_izq,Html.fromHtml(fechaEstacion));
	    		updateViews.setTextColor(R.id.tw_linea3_datos_izq,Color.parseColor("red"));
	    	}
	
	        // Tell the AppWidgetManager to perform an update on the current App Widget
	    	
	    	//Cargamos el nuevo valor del obtujeto estación en el hashMap estaciones
	    	//estaciones.put(appWidgetId, ee);
	    	
			//Evento onClick en el widget, para lanzar preferencias  
			Intent launchIntent = new Intent(context,Preferencias.class);
			launchIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
	
	  		PendingIntent intent = PendingIntent.getActivity(context, appWidgetId, launchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
	  		updateViews.setOnClickPendingIntent(R.id.centro, intent);
	      
	  		//appWidgetManager.updateAppWidget(appWidgetId, updateViews);
	  		
	  		//	Evento onClick en el widget, para lanzar datos de la estación  
			Intent launchTabPantalla = new Intent(context,tabPantalla.class);
			//launchIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
			launchTabPantalla.putExtra("codigo", ee.getCodigo());
			launchTabPantalla.putExtra("nombre", ee.getNombre());
			launchTabPantalla.putExtra("estado", ee.getEstado());
			launchTabPantalla.putExtra("desEstado", ee.getError());
	
	  		PendingIntent intent2 = PendingIntent.getActivity(context, appWidgetId, launchTabPantalla, PendingIntent.FLAG_UPDATE_CURRENT);
	  		updateViews.setOnClickPendingIntent(R.id.izquierda, intent2);
	  		
	  		//Evento onClick en el widget, para actualización manual
	  		Intent intentUpdate = new Intent(meteoclimatic.MY_WIDGET_UPDATE);
	  		PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intentUpdate, 0);
	  		//PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intentUpdate, 0);
	  		updateViews.setOnClickPendingIntent(R.id.derecha, pendingIntent);
	  		//updateViews.setViewVisibility(R.id.imagenActual,4);//4=invisible
	  		appWidgetManager.updateAppWidget(appWidgetId, updateViews);
	  		Log.d("meteoclimatic.updateAppWidget","Fin actualización :" + format.format(date)+" - Estación: "+ee.getNombre());
    	}
	}
	
	/**
	 * Actualiza los datos del widget, sin descargar los datos.
	 * @param context
	 * @param appWidgetManager
	 * @param appWidgetId
	 */
	static void updateAppWidgetInterface(Context context, AppWidgetManager appWidgetManager, int appWidgetId) 
	{
		updateAppWidget(context, appWidgetManager, appWidgetId,false);
	}
	
    public static ConnectivityManager getAppConnectivityManager()
    {
    	return (ConnectivityManager) contexto.getSystemService(Context.CONNECTIVITY_SERVICE);
    }
    
    public Context getContexto()
    {
    	return contexto;
    }

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		super.onReceive(context, intent);
		
		if(MY_WIDGET_UPDATE.equals(intent.getAction())){
			
			   //Toast.makeText(context, "Actualizando widget: "+intent.getAction() + context, Toast.LENGTH_LONG).show();
			   //Log.d(tag,"Actualizando widget: "+intent.getAction() +" - "+ AppWidgetManager.getInstance(context));
			   AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
			   ComponentName thisAppWidget = new ComponentName(context.getPackageName(), meteoclimatic.class.getName());
			   int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisAppWidget);

			   onUpdate(context, appWidgetManager, appWidgetIds);
			   

			   
		}
	}

}
